package ch01_design_principles.liskov;

/**
 * Liskov Substitution Principle，里氏替换原则，简称LSP
 * 子类必须能够替换其父类，否则不应当设计为其子类；父类出现的地方，都应该能由其子类代替；所以，子类只能去扩展基类，而不是隐藏或者覆盖基类。
 * 策略模式 | 组合模式 | 代理模式
 * <p>
 * 子类必须完全实现父类的方法
 * 子类可以有自己的个性
 * 覆盖或实现父类的方法时[输入]参数可以被放大
 * 覆盖或实现父类的方法时[输出]结果可以被缩小
 *
 * @author guodd
 * @version 1.0
 */
public class MainUse {
    public static void main(String[] args) {
        Animal animal = new Bird();
        animal.move();
        // Exception in thread "main" java.lang.ClassCastException
        // 有子类的地方，父类未必就能适应，如果想转换，父类必须是子类构建出来的
        Horse horse =(Horse)animal;
        horse.move();

        Bird bird = (Bird) animal;
        bird.eat();
    }
}
